﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SoftwareConsulting.BI11.Studio.InternalServices;

namespace SoftwareConsulting.BI11.Studio.ProcessWait
{
    /// <summary>
    /// Класс окошка ожидания
    /// </summary>
    public partial class ProcessForm : Form
    {
        #region внутренние переменные
        //private Form _parent; //родительская форма
        private bool _isLoaded=false; //флаг окончания загрузки картинки        
        #endregion

        #region внутренние методы
        #region обработчики
        /// <summary>
        /// Обработчик окончания загрузки картинки
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PictureBox1LoadCompleted(object sender, AsyncCompletedEventArgs e)
        {
            _isLoaded = true;
        }
        #endregion
        #endregion

        #region публичные свойства
        /// <summary>
        /// Геттер информации о том, загрузилась ли картинка
        /// </summary>
        /// <returns></returns>
        public bool IsLoaded
        {
            get
            {
                return _isLoaded;
            }
        }

        /// <summary>
        /// Геттер-сеттер уровня прогресса (процентная строка от 0 до 100)
        /// </summary>
        public int Progress
        {
            get
            {
                return ProcessProgressBar.Value;
            }
            set
            {
                int wantval = value > 100 ? 100 : value < 0 ? 0 : value;
                if (Assert.FailIfNot(wantval >= Progress, Assert.Id.Assert00210))//как так? не может процентная строка пойти в обратную сторону
                {
                    ProcessProgressBar.Value = wantval;                    
                    ProcessProgressBar.Refresh();                
                    /*Refresh();
                    Invalidate();
                    PerformLayout();
                    Update();*/
                    UpdateStyles();
                    //_parent.Refresh();
                    //_parent.PerformLayout();
                }                
            }
        }

        /// <summary>
        /// Возвращает/устанавливает описание выполняемой операции
        /// </summary>
        /// <remarks>если описание установлено пустым, то строка
        /// с описанием скрывается</remarks>
        public string Description
        {
            get
            {
                return DescriptionLabel.Text;
            }
            set
            {
                if (string.IsNullOrEmpty(value))
                {
                    DescriptionLabel.Visible = false;
                }
                else
                {                    
                    DescriptionLabel.Text = value;
                    if (!DescriptionLabel.Visible)
                    {
                        DescriptionLabel.Visible = true;
                    }
                    DescriptionLabel.Refresh();
                }
            }
        }

        /// <summary>
        /// Геттер-сеттер флага видимости процентной строки
        /// </summary>
        public bool ProgressVisible
        {
            get
            {
                return ProcessProgressBar.Visible;
            }
            set
            {
                Progress = ProgressVisible ? Progress : 0;                
                if (value != ProgressVisible)
                {
                    int increment = ProcessProgressBar.Height;
                    if (!value)
                    {
                        increment = -increment;
                    }
                    this.Height += increment;
                }
                ProcessProgressBar.Visible = value;
            }
        }
        #endregion

        #region конструкторы и финализаторы
        /// <summary>
        /// Инициализация компонентов
        /// </summary>
        public ProcessForm()//Form parent)
        {
            //_parent = parent;
            InitializeComponent();
        }
        #endregion                
    }
}
